package cl.solidit.geomanagement.persistance;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import cl.solidit.geomanagement.persistance.model.Usuario;
import cl.solidit.geomanagement.persistance.util.Rut;

@Repository
public class UserDAO {
	@PersistenceContext
	private EntityManager em;

	@Transactional
	public void createOrUpdate(Usuario usuario) {
		if(usuario.getPersona()!=null)
			usuario.getPersona().setRut(usuario.getPersona().getRut());
		if (usuario.getId() == null || usuario.getId() <= 0)
			em.persist(usuario);
		em.merge(usuario);
	}

	@Transactional
	public Usuario login(String nombre, String password) {
		TypedQuery<Usuario> q = em
				.createQuery(
						"FROM Usuario u where u.nombre=:nombre and u.password=:password",
						Usuario.class);
		q.setParameter("nombre", nombre);
		q.setParameter("password", password);
		List<Usuario> usuario = q.getResultList();
		return usuario.size()>0 ? usuario.get(0):null;
	}

	@Transactional
	public Usuario findByRut(String rut) {
		rut = Rut.format(rut);
		TypedQuery<Usuario> q = em.createQuery(
				"from Usuario u WHERE u.persona.rut=:rut", Usuario.class);
		q.setParameter("rut", rut);
		List<Usuario> usuarios = q.getResultList();
		if (usuarios.size() == 0)
			return null;
		return usuarios.get(0);
	}

	@Transactional
	public Usuario findAgenteByRut(String rut) {
		rut = Rut.format(rut);
		TypedQuery<Usuario> q = em.createQuery(
				"from Usuario u WHERE u.persona.rut=:rut",
				Usuario.class);
		q.setParameter("rut", rut);
		List<Usuario> usuarios = q.getResultList();
		if (usuarios.size() == 0)
			return null;
		return usuarios.get(0);
	}
	
	@Transactional
	public List<Usuario> traerAgentes(){
		TypedQuery<Usuario> q = em.createQuery("From Usuario u WHERE u.rol=2", Usuario.class);
		List<Usuario> agentes = q.getResultList();
		return agentes;
	}

	@Transactional
	public Usuario consultarAgente(Long id) {
		TypedQuery<Usuario> q = em.createQuery("FROM Usuario u where u.id=:id",
				Usuario.class);
		q.setParameter("id", id);
		List<Usuario> resultado = q.getResultList();
		if (resultado.size() == 0)
			return null;
		return resultado.get(0);
	}

	@Transactional
	public Usuario findById(Long id) {
		return em.find(Usuario.class, id);
	}

}
